package busterminalweb.action;

import busterminalweb.authorization.service.Role;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Класс для регистрации и получения требуемых сервисов
 */
public class ActionManager {

    /**
     * Хранилище объектов {@link Action}
     */
    private static Map<String, Action> actionMap = new HashMap<String, Action>();
    /**
     * Хранилище для каждого действия множества ролей
     */
    private static Map<String, Set<Role>> allowedRoles = new HashMap<String, Set<Role>>();

    /**
     * Добавить новое действие
     * @param action действие
     */
    public void addAction(Action action, Role... allowedRoles) {
        ActionManager.actionMap.put(action.getName(), action);
        Set<Role> roles = EnumSet.noneOf(Role.class);
        roles.addAll(Arrays.asList(allowedRoles));
        ActionManager.allowedRoles.put(action.getName(), roles);
    }

    /**
     * Получить действие
     * @param name имя действия
     * @return объект {@link Action}
     */
    public Action findAction(String name) {
        return actionMap.get(name);
    }

    /**
     * Проверить допустимость дейсвтия для заданной роли
     * @param actionName действие
     * @param role роль
     * @return true - действие допустимо, false - запрещено
     */
    public static boolean isActionAllowed(String actionName, Role role) {
        Action action = actionMap.get(actionName);
        Set<Role> roles = allowedRoles.get(actionName);
        if (action != null && roles != null) {
            return roles.contains(role);
        }
        return false;
    }
}
